<?php
/**
 * Created by YuanPan.
 * User: YuanPan
 * Date: 2018/5/12
 * Time: 18:12
 */

namespace app\api\validate;


use app\api\lib\exception\MissException;
use app\api\lib\exception\ParamException;
use think\Validate;



class BaseValidate extends Validate
{

    //自定义验证方法可以传入的参数共有5个（后面三个根据情况选用）
    //依次为：验证数据,验证规则,全部数据（数组）,字段名,字段描述

    //公共验证方法
    public function goCheck()
    {
        //获取请求参数
        $params = input();
        //开启批量验证
        $check = $this->batch()->check($params);
        if($check){
            return true;
        }else{
            //如果参数为批量，则返回错误为数组，则转化为字符串
            if(is_array($this->error)){
                $error = implode(',',$this->error);
            }
            //抛出错误信息
            throw new ParamException([
                'msg'=>$error,
            ]);
        }
    }

    //验证是正数
    protected function isFloatOrpositive($value,$rule,$data)
    {
       if($value < 0){
           return false;
       }else{
           return true;
       }
    }

    // 自定义验证规则,判断ID是否为正整数
    protected function isPositiveInteger($value, $rule='', $data='', $field='')
    {
        if (is_numeric($value) && is_int($value + 0) && ($value + 0) > 0) {
            return true;
        }
        return $field . '必须是正整数';
    }

    /**
     * @param array $arrays 通常传入request.post变量数组
     * @return array 按照规则key过滤后的变量数组
     * @throws MissException
     */
    //判断参数中是否恶意传入user_id 或者 uid
    public function getDataByRule($arrays)
    {
        if (array_key_exists('user_id', $arrays) | array_key_exists('uid', $arrays)) {
            // 不允许包含user_id或者uid，防止恶意覆盖user_id外键
            throw new MissException([
                'msg' => '参数中包含有非法的参数名user_id或者uid'
            ]);
        }
        $newArray = [];
        foreach ($this->rule as $key => $value) {
            $newArray[$key] = $arrays[$key];
        }
        return $newArray;
    }

    //判断参数中是否恶意传入 id
    public function getDataIDByRule($arrays)
    {
        if (array_key_exists('id', $arrays)) {
            // 不允许包含id
            throw new MissException([
                'msg' => '参数中包含有非法的参数名id'
            ]);
        }
        return true;
    }

    //判断参数是否为空值
    protected function isNotEmpty($value, $rule='', $data='', $field='')
    {
        if (empty($value)) {
            return $field . '不允许为空';
        } else {
            return true;
        }
    }

    //手机号的验证规则
    protected function isMobile($value)
    {
        $rule = '^1(3|4|5|7|8)[0-9]\d{8}$^';
        $result = preg_match($rule, $value);
        if ($result) {
            return true;
        } else {
            return false;
        }
    }

    //自定义验证规则，验证菜品必须为数组以及等格式
    protected function checkFood($value)
    {
        if(empty($value)){
            throw new ParamException(['msg' => '商品列表不允许为空']);
        }
        $validate = new BaseValidate($this->singleRule);
        foreach ($value as $v) {
            $check = $validate->check($v);
            if(!$check){
                throw new ParamException(['msg' => '商品列表参数错误']);
            }
        }
        return true;
    }
}